import os
import sys



"""
代码功能说明：
read_file 函数：
读取指定路径的文件内容。
每行内容按逗号分割，解析为图像名称和计数。
将解析结果存储到字典中，图像名称作为键，计数作为值。
主函数：
从命令行参数中获取输入和输出目录。
检查提交目录是否存在，如果不存在则报错。
如果提交目录和真实标签目录都存在，创建输出目录。
读取真实标签文件和提交的结果文件。
确保真实标签和提交结果的数量一致。
遍历真实标签字典，比较提交结果是否与真实标签一致，统计正确计数。
计算准确率并写入输出文件。
希望这些注释能够帮助你更好地理解代码的功能和实现细节。
 

"""
# 读取文件内容并解析为字典
def read_file(path):
    struct = {}  # 初始化一个空字典用于存储解析结果
    with open(path, 'r') as file:  # 打开文件进行读取
        for line in file:  # 遍历文件的每一行
            line = line.rstrip().split(',')  # 去除行尾的换行符并按逗号分割
            im_name, count = line  # 解析图像名称和计数
            struct[im_name] = count  # 将图像名称和计数存储到字典中
    return struct  # 返回解析后的字典


if __name__ == "__main__":
    # 从命令行参数中获取输入和输出目录
    input_dir = sys.argv[1]
    output_dir = sys.argv[2]

    # 定义提交目录和真实标签目录
    submit_dir = os.path.join(input_dir, 'res')
    truth_dir = os.path.join(input_dir, 'ref')

    # 检查提交目录是否存在
    if not os.path.isdir(submit_dir):
        print("%s 不存在".format(submit_dir))

    # 如果提交目录和真实标签目录都存在，创建输出目录
    if os.path.isdir(submit_dir) and os.path.isdir(truth_dir):
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)

    # 定义真实标签文件和结果文件的路径
    gt_file = os.path.join(truth_dir, 'ground_truth.txt')
    result_file = os.path.join(submit_dir, 'result.txt')

    # 读取真实标签文件和结果文件
    gt = read_file(gt_file)  # 读取真实标签
    rt = read_file(result_file)  # 读取提交的结果

    # 确保真实标签和结果的数量一致
    assert(len(gt) == len(rt)), "真实标签和结果的数量不一致"

    # 初始化正确计数变量
    correct = 0
    # 遍历真实标签字典
    for im_name, count in gt.items():
        # 如果提交的结果与真实标签一致
        if rt[im_name] == count:
            correct += 1  # 增加正确计数

    # 定义输出文件路径
    outputfile_name = os.path.join(output_dir, 'scores.txt')
    # 打开输出文件
    output_file = open(outputfile_name, 'w')
    # 写入准确率
    output_file.write("Accuracy: {} \n".format(float(correct) / float(len(gt))))
    # 关闭输出文件
    output_file.close()